#include "Mision.h"



//**********************//
// CLASE MISION (PADRE) //
//**********************//


#include <sstream>



Mision::Mision(void)
{
		Completa = false;
}

Mision::Mision(std::string const & id, std::string des)
{
	Descrip = des;
	Ident = id;
	Completa = false;

}


Mision::~Mision(void)
{
}


//*******************//
// CLASE ALCANZAROBJ //
//*******************//


Ogre::Vector3 AlcanzarObj::GetPosObj()
{
	return EsferaCentro;

}


AlcanzarObj::AlcanzarObj()
{
	Completa = false;
}

AlcanzarObj::AlcanzarObj(Ogre::Vector3 cen, float rad, Tangible * nav): 
EsferaCentro(cen), Radio(rad), Ship(nav)
{
		Completa = false;
}

AlcanzarObj::AlcanzarObj(const std::string & id, std::string des, Ogre::Vector3 cen, float rad, Tangible * nav):
EsferaCentro(cen), Radio(rad), Ship(nav)
{
		Ident = id;
		Completa = false;
		Descrip = des;
	
}


void AlcanzarObj::SetObjetivo(Ogre::Vector3 cen, float rad)
{
	EsferaCentro = cen; 
	Radio = rad;
}

bool AlcanzarObj::EsCompletada()
{

	Completa = (EsferaCentro.squaredDistance(Ship->GetPosition()) < Radio * Radio);
	return Completa;	

}

float AlcanzarObj::GetDistToObj() const
{
	return (EsferaCentro.distance(Ship->GetPosition()));
}

std::string const & AlcanzarObj::GetDescrip() const
{
	std::ostringstream ss;
	ss << Descrip << "\n";
	ss << "Distancia: " << GetDistToObj() / 1000.0;
	mDescripDetallada = ss.str();
	return mDescripDetallada;
}

//*******************//
// CLASE DESTRUIROBJ //
//*******************//

void DestruirObj::AnadirObj(unsigned long id)
{
	Object::Ptr obj = Manager->GetObjectPtr(id);
	Object::WeakPtr wobj = obj;
	mObjetivos.push_back(wobj);
	ObjRestantes++;
}

DestruirObj::DestruirObj()
{

	Manager = ObjectsManager::Get();
	ObjRestantes = 0;
	Completa = false;

}

DestruirObj::DestruirObj(const std::string &id, std::string des)
{
	Manager = ObjectsManager::Get();
	ObjRestantes = 0;
	Descrip = des;
	Ident = id;
	Completa = false;
}
	


void DestruirObj::UpdateDestruidos()
{
	list<Object::WeakPtr>::iterator temp, toer;

	for(temp = mObjetivos.begin() ; temp != mObjetivos.end(); )
	{
		Object * obj = temp->lock().get();
		Tangible * tan = dynamic_cast<Tangible *>(obj);
		if( !tan || tan->GetEsDestruido() )
		{
			toer = temp;
			++temp;
			mObjetivos.erase(toer);
			ObjRestantes--;
		}
		else
			++temp;
	}
	//for (temp = lObjetivos.begin(); temp != lObjetivos.end(); temp++)
	//	{
	//		Object * obj = temp->get();
	//		Tangible * tan = dynamic_cast<Tangible *>(obj);
	//		if (tan->GetEsDestruido()) 
	//		{
	//			lObjetivos.erase(temp);
	//			ObjRestantes--;
	//		}
	//	}
}


void DestruirObj::SetCurrentObj(Tangible * obj)

{
	CurrentObj = *mObjetivos.begin();
	
}

float DestruirObj::GetDistToObj() const
{
	if (!CurrentObj.lock().get()) 
	return 0;
	else
	return (dynamic_cast<Tangible *>(CurrentObj.lock().get())->GetPosition().distance(Ship->GetPosition()));
}

bool DestruirObj::EsCompletada()
{
	list<Object::WeakPtr>::iterator temp, toer;

	for(temp = mObjetivos.begin() ; temp != mObjetivos.end(); )
	{
		Object * obj = temp->lock().get();
		Tangible * tan = dynamic_cast<Tangible *>(obj);
		if( !tan || tan->GetEsDestruido() )
		{
			toer = temp;
			++temp;
			mObjetivos.erase(toer);
			ObjRestantes--;
		}
		else
			++temp;
	}
	if (!mObjetivos.empty())
	CurrentObj = *(mObjetivos.begin());
	else
		CurrentObj = Object::WeakPtr();
	return mObjetivos.empty();
}


DestruirObj::DestruirObj(const std::string &id, std::string des, Tangible *tan)
{
	Ship = tan;
	Manager = ObjectsManager::Get();
	ObjRestantes = 0;
	Descrip = des;
	Ident = id;
	Completa = false;
}

int DestruirObj::GetObjRestantes() const
{
	return (ObjRestantes);
}


Tangible * DestruirObj::GetCurrentObj()
{
	return dynamic_cast<Tangible *>(CurrentObj.lock().get());
}

std::string const & DestruirObj::GetDescrip() const
{
	std::ostringstream ss;
	ss << Descrip << "\n"; 
	ss << "Quedan: " << GetObjRestantes();
	mDescripDetallada = ss.str();
	return mDescripDetallada;
}








